μ¬μ¬μ© κ°λ₯νκ³ μ μ°νλ©° μ μ§λ³΄μνκΈ° μ¬μ΄ UI ꡬμΆμ μν React λ³΅ν© μ»΄ν¬λνΈ ν¨ν΄μ νμν©λλ€. λͺ¨λ² μ¬λ‘μ μ€μ μ¬λ‘λ₯Ό μμ보μΈμ.
React μ»΄ν¬λνΈ ν©μ±: λ³΅ν© μ»΄ν¬λνΈ ν¨ν΄ λ§μ€ν°νκΈ°
React κ°λ° μΈκ³μμ μ»΄ν¬λνΈ ν©μ±μ λ μκ³ μ¬μ¬μ© κ°λ₯ν λΉλ© λΈλ‘μΌλ‘ 볡μ‘ν UIλ₯Ό λ§λ€ μ μκ² ν΄μ£Όλ κ·Όλ³Έμ μΈ κ°λ μ λλ€. λ€μν ν©μ± κΈ°λ² μ€μμ λ³΅ν© μ»΄ν¬λνΈλ λ§€μ° μ μ°νκ³ μ§κ΄μ μΈ μ¬μ©μ μΈν°νμ΄μ€λ₯Ό ꡬμΆνλ κ°λ ₯ν ν¨ν΄μΌλ‘ λκ°μ λνλ λλ€. μ΄ κΈμμλ λ³΅ν© μ»΄ν¬λνΈ ν¨ν΄μ κΉμ΄ νκ³ λ€μ΄ μ΄μ , ꡬν λ° μ€μ μ μ© μ¬λ‘μ λν ν¬κ΄μ μΈ μ΄ν΄λ₯Ό μ 곡ν©λλ€.
λ³΅ν© μ»΄ν¬λνΈλ 무μμΈκ°μ?
λ³΅ν© μ»΄ν¬λνΈλ μμ μ»΄ν¬λνΈκ° μμ μ»΄ν¬λνΈμ μ묡μ μΌλ‘ μνμ λμμ 곡μ νλ λμμΈ ν¨ν΄μ λλ€. μ¬λ¬ λ 벨μ ν΅ν΄ λͺ μμ μΌλ‘ propsλ₯Ό μ λ¬νλ λμ , μμ μ»΄ν¬λνΈκ° ν΅μ¬ λ‘μ§μ κ΄λ¦¬νκ³ μμ μ»΄ν¬λνΈκ° μνΈ μμ©ν μ μλ λ©μλ λλ 컨ν μ€νΈλ₯Ό λ ΈμΆν©λλ€. μ΄ μ κ·Ό λ°©μμ μ»΄ν¬λνΈλ₯Ό μ¬μ©νλ κ°λ°μλ₯Ό μν΄ μμ§λ ₯ μκ³ μ§κ΄μ μΈ APIλ₯Ό μ΄μ§ν©λλ€.
κ° λΆλΆμ΄ μ체μ μΈ νΉμ κΈ°λ₯μ κ°μ§κ³ μμμλ λΆκ΅¬νκ³ μννκ² ν¨κ» μλνλ μνΈ μ°κ²°λ λΆλΆλ€μ μ§ν©μ΄λΌκ³ μκ°νλ©΄ λ©λλ€. μ΄ μ»΄ν¬λνΈλ€μ "νλ ₯μ μΈ" νΉμ±μ΄ λ³΅ν© μ»΄ν¬λνΈλ₯Ό μ μν©λλ€.
λ³΅ν© μ»΄ν¬λνΈ μ¬μ©μ μ΄μ
- ν₯μλ μ¬μ¬μ©μ±: λ³΅ν© μ»΄ν¬λνΈλ μλΉν μμ μμ΄ μ ν리μΌμ΄μ μ λ€λ₯Έ λΆλΆμμ μ½κ² μ¬μ¬μ©ν μ μμ΅λλ€.
- ν₯μλ μ μ°μ±: μμ μ»΄ν¬λνΈλ μμ μ»΄ν¬λνΈκ° λμκ³Ό λͺ¨μμ μ¬μ©μ μ μν μ μλλ‘ νλ μ μ°ν APIλ₯Ό μ 곡ν©λλ€.
- λ¨μνλ API: μ»΄ν¬λνΈλ₯Ό μ¬μ©νλ κ°λ°μλ 볡μ‘ν prop drillingμ κ΄λ¦¬νλ λμ λ¨μΌνκ³ μ μ μλ APIμ μνΈ μμ©ν©λλ€.
- 보μΌλ¬νλ μ΄νΈ μ½λ κ°μ: μνμ λμμ μ묡μ μΌλ‘ 곡μ ν¨μΌλ‘μ¨ λ³΅ν© μ»΄ν¬λνΈλ μΌλ°μ μΈ UI ν¨ν΄μ ꡬννλ λ° νμν 보μΌλ¬νλ μ΄νΈ μ½λμ μμ μ΅μνν©λλ€.
- μ¦κ°λ μ μ§λ³΄μμ±: μμ μ»΄ν¬λνΈμ μ€μ μ§μ€μ λ‘μ§μΌλ‘ μΈν΄ μ»΄ν¬λνΈμ κΈ°λ₯μ μ μ§λ³΄μνκ³ μ λ°μ΄νΈνκΈ°κ° λ μ½μ΅λλ€.
ν΅μ¬ κ°λ μ΄ν΄
ꡬν μΈλΆ μ¬νμ λ€μ΄κ°κΈ° μ μ λ³΅ν© μ»΄ν¬λνΈ ν¨ν΄μ κΈ°μ΄κ° λλ ν΅μ¬ κ°λ μ λͺ νν ν΄λ΄ μλ€.
- μ묡μ μν 곡μ : μμ μ»΄ν¬λνΈκ° 곡μ μνλ₯Ό κ΄λ¦¬νκ³ , μμ μ»΄ν¬λνΈλ μ’ μ’ μ»¨ν μ€νΈλ₯Ό ν΅ν΄ μ묡μ μΌλ‘ μ κ·Όν©λλ€.
- μ μ΄ μ»΄ν¬λνΈ: μμ μ»΄ν¬λνΈλ μ’ μ’ μμμμ μ 곡νλ 곡μ μνμ ν¨μμ λ°λΌ μ체 λ λλ§μ μ μ΄ν©λλ€.
- 컨ν μ€νΈ API: Reactμ 컨ν μ€νΈ APIλ μμ λ° μμ μ»΄ν¬λνΈ κ°μ μ묡μ μν 곡μ λ° ν΅μ μ μ΄μ§νλ λ° μμ£Ό μ¬μ©λ©λλ€.
λ³΅ν© μ»΄ν¬λνΈ κ΅¬ν: μ€μ©μ μΈ μ
κ°λ¨ν Accordion μ»΄ν¬λνΈλ₯Ό μ¬μ©νμ¬ λ³΅ν© μ»΄ν¬λνΈ ν¨ν΄μ μ€λͺ
ν΄ λ³΄κ² μ΅λλ€. Accordion μ»΄ν¬λνΈλ μμ μ»΄ν¬λνΈ(Accordion)μ λ κ°μ μμ μ»΄ν¬λνΈ(AccordionItem λ° AccordionContent)λ‘ κ΅¬μ±λ©λλ€. Accordion μ»΄ν¬λνΈλ νμ¬ μ΄λ € μλ νλͺ©μ μνλ₯Ό κ΄λ¦¬ν©λλ€.
1. Accordion μ»΄ν¬λνΈ (μμ)
import React, { createContext, useState, useContext, ReactNode } from 'react';
interface AccordionContextType {
openItem: string | null;
toggleItem: (itemId: string) => void;
}
const AccordionContext = createContext(undefined);
interface AccordionProps {
children: ReactNode;
}
const Accordion: React.FC = ({ children }) => {
const [openItem, setOpenItem] = useState(null);
const toggleItem = (itemId: string) => {
setOpenItem((prevOpenItem) => (prevOpenItem === itemId ? null : itemId));
};
const value: AccordionContextType = {
openItem,
toggleItem,
};
return (
{children}
);
};
export default Accordion;
μ΄ μ½λμμ:
- 곡μ μνλ₯Ό κ΄λ¦¬νκΈ° μν΄
createContextλ₯Ό μ¬μ©νμ¬AccordionContextλ₯Ό μμ±ν©λλ€. Accordionμ»΄ν¬λνΈλ μμ μ»΄ν¬λνΈμ΄λ©°,openItemμνμtoggleItemν¨μλ₯Ό κ΄λ¦¬ν©λλ€.AccordionContext.ProviderλAccordionλ΄μ λͺ¨λ μμ μ»΄ν¬λνΈμ μνμ ν¨μλ₯Ό μ¬μ©ν μ μκ² ν©λλ€.
2. AccordionItem μ»΄ν¬λνΈ (μμ)
import React, { useContext, ReactNode } from 'react';
import { AccordionContext } from './Accordion';
interface AccordionItemProps {
itemId: string;
title: string;
children: ReactNode;
}
const AccordionItem: React.FC = ({ itemId, title, children }) => {
const context = useContext(AccordionContext);
if (!context) {
throw new Error('AccordionItem must be used within an Accordion');
}
const { openItem, toggleItem } = context;
const isOpen = openItem === itemId;
return (
toggleItem(itemId)}>
{title}
{isOpen && {children}}
);
};
export default AccordionItem;
μ΄ μ½λμμ:
AccordionItemμ»΄ν¬λνΈλuseContextλ₯Ό μ¬μ©νμ¬AccordionContextλ₯Ό μλΉν©λλ€.- propsλ‘
itemIdμtitleμ λ°μ΅λλ€. - 컨ν
μ€νΈμ
openItemμνλ₯Ό κΈ°λ°μΌλ‘ νλͺ©μ΄ μ΄λ € μλμ§ μ¬λΆλ₯Ό κ²°μ ν©λλ€. - ν€λλ₯Ό ν΄λ¦νλ©΄ 컨ν
μ€νΈμ
toggleItemν¨μλ₯Ό νΈμΆνμ¬ νλͺ©μ μ΄λ¦Ό μνλ₯Ό ν κΈν©λλ€.
3. μ¬μ© μ
import React from 'react';
import Accordion from './Accordion';
import AccordionItem from './AccordionItem';
const App: React.FC = () => {
return (
Content for section 1.
Content for section 2.
Content for section 3.
);
};
export default App;
μ΄ μμλ Accordionκ³Ό AccordionItem μ»΄ν¬λνΈκ° ν¨κ» μ¬μ©λλ λ°©λ²μ 보μ¬μ€λλ€. Accordion μ»΄ν¬λνΈλ 컨ν
μ€νΈλ₯Ό μ 곡νκ³ , AccordionItem μ»΄ν¬λνΈλ μ΄λ₯Ό μλΉνμ¬ μ΄λ¦Ό μνλ₯Ό κ΄λ¦¬ν©λλ€.
κ³ κΈ λ³΅ν© μ»΄ν¬λνΈ ν¨ν΄
κΈ°λ³Έ μμ λ₯Ό λμ΄μ, λ³΅ν© μ»΄ν¬λνΈλ λ κ³ κΈ κΈ°λ²μΌλ‘ λμ± ν₯μλ μ μμ΅λλ€.
1. μ¬μ©μ μ μ λ λ νλ‘
λ λ νλ‘μ μ¬μ©νλ©΄ μμ μ»΄ν¬λνΈμ μ¬μ©μ μ μ λ λλ§ λ‘μ§μ μ½μ ν μ μμ΅λλ€. μ΄λ ν¨μ¬ λ ν° μ μ°μ±κ³Ό μ¬μ©μ μ μ μ΅μ μ μ 곡ν©λλ€.
μ:
<Accordion>
<Accordion.Item itemId="item1" title="Section 1">
{(isOpen) => (
<p>Content for section 1. {isOpen ? 'Open' : 'Closed'}</p>
)}
</Accordion.Item>
</Accordion>
μ΄ μμμμ Accordion.Item μ»΄ν¬λνΈλ isOpen μνλ₯Ό λ λ νλ‘μ μ 곡νμ¬ μ¬μ©μκ° νλͺ©μ μ΄λ¦Ό μνμ λ°λΌ μ½ν
μΈ λ₯Ό μ¬μ©μ μ μν μ μλλ‘ ν©λλ€.
2. μ μ΄ νλ‘
μ μ΄ νλ‘μ μ¬μ©νλ©΄ μ¬μ©μκ° μΈλΆμμ μ»΄ν¬λνΈμ μνλ₯Ό λͺ μμ μΌλ‘ μ μ΄ν μ μμ΅λλ€. μ΄λ μ»΄ν¬λνΈμ μνλ₯Ό μ ν리μΌμ΄μ μ λ€λ₯Έ λΆλΆκ³Ό λκΈ°νν΄μΌ νλ μλ리μ€μ μ μ©ν©λλ€.
μ:
<Accordion openItem="item2">
...
</Accordion>
μ΄ μμμμ openItem propμ μ²μμ μ΄λ € μλ νλͺ©μ λͺ
μμ μΌλ‘ μ€μ νλ λ° μ¬μ©λ©λλ€. κ·Έλ° λ€μ Accordion μ»΄ν¬λνΈλ μ΄ propμ μ‘΄μ€ν΄μΌ νλ©°, λΆλͺ¨κ° μ μ΄ propμ μ
λ°μ΄νΈν μ μλλ‘ λ΄λΆ μν λ³κ²½ μ μ½λ°±μ μ 곡ν μ μμ΅λλ€.
3. `useReducer`λ₯Ό μ¬μ©νμ¬ λ³΅μ‘ν μν κ΄λ¦¬
μμ μ»΄ν¬λνΈ λ΄μμ λ 볡μ‘ν μν κ΄λ¦¬λ₯Ό μν΄μλ useReducer ν
μ κ³ λ €νμμμ€. μ΄λ μν λ‘μ§μ ꡬμ±νκ³ λ μμΈ‘ κ°λ₯νκ² λ§λλ λ° λμμ΄ λ μ μμ΅λλ€.
λ³΅ν© μ»΄ν¬λνΈμ μ€μ μ¬λ‘
λ³΅ν© μ»΄ν¬λνΈλ λ€μν UI λΌμ΄λΈλ¬λ¦¬ λ° νλ μμν¬μμ λ리 μ¬μ©λ©λλ€. μΌλ°μ μΈ μλ λ€μκ³Ό κ°μ΅λλ€.
- Tabs:
Tabλ°TabPanelμμ μ»΄ν¬λνΈκ° μλTabsμ»΄ν¬λνΈ. - Select:
Optionμμ μ»΄ν¬λνΈκ° μλSelectμ»΄ν¬λνΈ. - Modal:
ModalHeader,ModalBodyλ°ModalFooterμμ μ»΄ν¬λνΈκ° μλModalμ»΄ν¬λνΈ. - Menu:
MenuItemμμ μ»΄ν¬λνΈκ° μλMenuμ»΄ν¬λνΈ.
μ΄ μμλ€μ λ³΅ν© μ»΄ν¬λνΈκ° μ΄λ»κ² μ§κ΄μ μ΄κ³ μ μ°ν UI μμλ₯Ό λ§λλ λ° μ¬μ©λ μ μλμ§λ₯Ό 보μ¬μ€λλ€.
λ³΅ν© μ»΄ν¬λνΈ μ¬μ© λͺ¨λ² μ¬λ‘
λ³΅ν© μ»΄ν¬λνΈ ν¨ν΄μ ν¨κ³Όμ μΌλ‘ νμ©νλ €λ©΄ λ€μ λͺ¨λ² μ¬λ‘λ₯Ό λ°λ₯΄μμμ€.
- APIλ₯Ό λ¨μνκ² μ μ§: μ»΄ν¬λνΈλ₯Ό μ¬μ©νλ κ°λ°μλ₯Ό μν λͺ ννκ³ μ§κ΄μ μΈ APIλ₯Ό μ€κ³νμμμ€.
- μΆ©λΆν μ μ°μ± μ 곡: λ λ νλ‘, μ μ΄ νλ‘ λλ κΈ°ν κΈ°λ²μ ν΅ν΄ μ¬μ©μ μ μ μ΅μ μ μ 곡νμμμ€.
- API μ² μ ν λ¬Έμν: κ°λ°μκ° μ»΄ν¬λνΈλ₯Ό ν¨κ³Όμ μΌλ‘ μ¬μ©νλ λ°©λ²μ μλ΄νλ ν¬κ΄μ μΈ λ¬Έμλ₯Ό μ 곡νμμμ€.
- μ² μ νκ² ν μ€νΈ: μ»΄ν¬λνΈμ κΈ°λ₯κ³Ό κ²¬κ³ μ±μ 보μ₯νκΈ° μν΄ μ² μ ν ν μ€νΈλ₯Ό μμ±νμμμ€.
- μ κ·Όμ± κ³ λ €: μ»΄ν¬λνΈκ° μ₯μ κ° μλ μ¬μ©μμκ² μ κ·Ό κ°λ₯νλλ‘ νμμμ€. μ κ·Όμ± μ§μΉ¨μ λ°λ₯΄κ³ ARIA μμ±μ μ μ νκ² μ¬μ©νμμμ€. μλ₯Ό λ€μ΄,
Accordionμμ κ° κ° νλͺ©μ νμ₯/μΆμ μνλ₯Ό μ€ν¬λ¦° 리λμ μ리기 μν΄ ARIA μμ±μ μ¬λ°λ₯΄κ² κ΄λ¦¬νλμ§ νμΈνμμμ€.
μΌλ°μ μΈ ν¨μ λ° νΌνλ λ°©λ²
- APIλ₯Ό κ³Όλνκ² λ³΅μ‘νκ² λ§λ€κΈ°: APIλ₯Ό νΌλμ€λ½κ³ μ¬μ©νκΈ° μ΄λ ΅κ² λ§λλ λ무 λ§μ μ¬μ©μ μ μ μ΅μ μ μΆκ°νλ κ²μ νΌνμμμ€.
- κΈ΄λ°ν κ²°ν©: μμ μ»΄ν¬λνΈκ° μμ μ»΄ν¬λνΈμ λ무 κΈ΄λ°νκ² κ²°ν©λμ§ μλλ‘ νμ¬ μ¬μ¬μ©μ±μ μ ννλ κ²μ νΌνμμμ€.
- μ κ·Όμ± λ¬΄μ: μ κ·Όμ± κ³ λ € μ¬νμ 무μνλ©΄ μ₯μ κ° μλ μ¬μ©μμκ² μ»΄ν¬λνΈκ° μ¬μ©ν μ μκ² λ μ μμ΅λλ€.
- μ μ ν λ¬Έμ μ 곡 μ€ν¨: λΆμΆ©λΆν λ¬Έμλ κ°λ°μκ° μ»΄ν¬λνΈ μ¬μ© λ°©λ²μ μ΄ν΄νκΈ° μ΄λ ΅κ² λ§λ€ μ μμ΅λλ€.
κ²°λ‘
λ³΅ν© μ»΄ν¬λνΈλ Reactμμ μ¬μ¬μ© κ°λ₯νκ³ μ μ°νλ©° μ μ§λ³΄μνκΈ° μ¬μ΄ μ¬μ©μ μΈν°νμ΄μ€λ₯Ό ꡬμΆνλ κ°λ ₯ν λꡬμ λλ€. ν΅μ¬ κ°λ μ μ΄ν΄νκ³ λͺ¨λ² μ¬λ‘λ₯Ό λ°λ₯΄λ©΄ μ΄ ν¨ν΄μ ν¨κ³Όμ μΌλ‘ νμ©νμ¬ μ§κ΄μ μ΄κ³ μ¬μ©μ μΉνμ μΈ μ»΄ν¬λνΈλ₯Ό λ§λ€ μ μμ΅λλ€. μ»΄ν¬λνΈ ν©μ±μ νμ λ°μλ€μ΄κ³ React κ°λ° κΈ°μ μ ν₯μμν€μΈμ.
λμμΈ μ νμ μ μΈκ³μ μΈ μν₯μ κ³ λ €νλ κ²μ μμ§ λ§μμμ€. λͺ ννκ³ κ°κ²°ν μΈμ΄λ₯Ό μ¬μ©νκ³ , μΆ©λΆν λ¬Έμλ₯Ό μ 곡νλ©°, μ»΄ν¬λνΈκ° λ€μν λ°°κ²½κ³Ό λ¬Ένλ₯Ό κ°μ§ μ¬μ©μμκ² μ κ·Ό κ°λ₯νλλ‘ νμμμ€.